/**
 * 菜单权限控制类
 */
export default class Auth
{
	/**
	 * 构造方法
	 *
	 * @param  {[type]} token token密钥
	 * @return {[type]}       [description]
	 */
 	constructor () {

  	}

  	/**
  	 * 获取菜单列表
  	 *
  	 * @param  {[type]} list 	路由表
  	 * @param  {[type]} access 	具有的权限
  	 * @return {[type]}     	[description]
  	 */
	getMenu (list, access) {
		let res = []
		this._forEach(list, item => {
			// 是否隐藏菜单
			if (!item.meta || (item.meta && !item.meta.hideInMenu)) {
				let obj = {
					icon: (item.meta && item.meta.icon) || '',
					name: item.name,
					meta: item.meta
				}
				// 是否存在子菜单
				if (
					(this.hasChild(item) || (item.meta && item.meta.showAlways))
					 && this.isShowMenu(item, access)
				)
				{
					obj.children = this.getMenu(item.children, access)
				}
				if (item.meta && item.meta.href) {
					obj.href = item.meta.href
				}
				if (this.isShowMenu(item, access)) {
					res.push(obj)
				}
			}
		})
		return res
	}

	/**
	 * 是否存在子菜单
	 *
	 * @param  {[type]}  item [description]
	 * @return {Boolean}      [description]
	 */
	hasChild (item) {
	  	return item.children && item.children.length !== 0
	}

	/**
	 * 是否添加子菜单
	 *
	 * @param  {[type]} item   [description]
	 * @param  {[type]} access [description]
	 * @return {[type]}        [description]
	 */
	isShowMenu (item, access)  {
		if (item.meta && item.meta.access && item.meta.access.length) {
			if (this._hasOneOf(item.meta.access, access)) {
				return true
			} else {
				return false
			} 
		} else {
			return true
		}
	}

	/**
	 * 遍历数组
	 *
	 * @param  {[type]}   arr [description]
	 * @param  {Function} fn  [description]
	 * @return {[type]}       [description]
	 */
	_forEach (arr, fn){
		if (!arr.length || !fn){ 
			return
		}
		let i = -1
		let len = arr.length
		while (++i < len) {
			let item = arr[i]
			fn(item, i, arr)
		}
	}

	/**
	 * 是否只存在一个
	 *
	 * @param  {[type]}  target [description]
	 * @param  {[type]}  arr    [description]
	 * @return {Boolean}        [description]
	 */
	_hasOneOf(target, arr){
		return target.some(_ => arr.indexOf(_) > -1)
	}
}
